# encoding=utf8
from sys import argv
from os import system
from grafo import Grafo
from grafo_pydot import GrafoPydot

def obter_matriz():
	'''Interface com o usuário para obter a matriz de adjacência'''
	while True:
		try:
			n = int( raw_input( 'Qual o tamanho da matriz de adjacência? ' ) )
			break
		except:
			print 'Entrada não numérica'

	matriz = []
	matriz_final = []
	error = False

	# Verificar se existem erros em cada entrada do usuário
	for i in range( n ):
		while True:
			linha = str( raw_input( 'Linha ' + str( i + 1 ) + ': ' ) )
			if len( linha ) != n:
				print 'Entrada maior que número de nós'
			else:
				error = False

			if not linha.isdigit():
				print 'Entrada não numérica'
				error = True
				continue
			else:
				error = False

			for digit in linha:
				if digit in '23456789':
					print 'Este programa somente é válido para arestas sem peso'
					error = True
					break
				else:
					error = False

			if error:
					continue

			matriz.append( linha )
			break

	for linha_str in matriz:
		matriz_final.append( [int( digito_str ) for digito_str in linha_str] )

	matriz = [int( linha ) for linha in matriz]
	return matriz_final

# Entrada com arquivo
try:
	f = file( argv[1], 'r' )
	mat_adj = []

	# Ler arquivo em matriz de adjacências:
	for line in f.readlines():
		mat_adj.append( [int( i ) for i in line.strip( '\n' )] )
	error = False

	# Verifica por erros no arquivo
	for i in range( len( mat_adj[0] ) ):
		linha = mat_adj[i]
		if len( linha ) != len( mat_adj[0] ):
			error = True
		else:
			error = False

		for digit in linha:
			if digit != 0 and digit != 1:
				error = True
				break
			else:
				error = False

		if error:
			print 'Arquivo inválido'
			f.close()
			raise Exception

	f.close()
except:
	mat_adj = obter_matriz()


grafo = Grafo( mat_adj )

# print 'Matriz de adjacências:'; grafo.mostrar()
print 'Graus de Saída:' + str( grafo.grau_de_saida )
print 'Graus de Entrada: ' + str( grafo.grau_de_entrada )
print 'Graus: ' + str( grafo.graus )
print 'Existem Vértices isolados' if grafo.tem_vert_isol else 'Não existem vértices isolados'
print 'É um grafo direcionado' if grafo.e_direcionado else 'É um grafo não direcionado'
print 'É uma árvore' if grafo.e_arvore else 'Não é uma árvore'
print 'É um grafo conexo' if grafo.e_conexo else 'Não é um grafo conexo'
print 'É um grafo completo' if grafo.e_completo else 'Não é um grafo completo'
grafo_dot = GrafoPydot( grafo )
grafo_dot.converter_para_dot()
grafo_dot.escrever()
try:
	system( 'xdot grafo.dot' )
except:
	pass
